<?php
	
	/* Cette classe permet de gerer les differentes moyennes d'un etudiant,
	 * cad obtenir sa moyenne pour un module particulier, une UE etc, a 
	 * partir de son ID dans la BDD.
	 */
	
	
	error_reporting(E_ALL);
	ini_set('display_errors', true);
	
	include_once "inc/defines.php";
	include_once "../../php/sqlhandler.php";
	
	class gestionnaireEtuMoy {
		private $id;
		private $db;
		
		public function __construct($id) {
			$this->id = $id;
			$this->db = new PDO(SERVER.":host=".HOST.";dbname=".BASE, USER, PASS);
		}
		
		public function getExamNote($id_exam, $prendreSimulees) {
			//on regarde si cet examen est dans une UE qui est actuellement capitalisee par l'etudiant
			$sqlQuery = "SELECT moyenne_uecap FROM ".UE_CAP_TABLE." WHERE id_ue IN(SELECT id_ue FROM ".MODULE_TABLE." WHERE id_module=(SELECT id_module FROM Examen WHERE id_examen=".$id_exam.")) AND id_etud=".$this->id.";";
			$st = $this->db->prepare($sqlQuery);
			$st->execute();
			$ligne = $st->fetch(PDO::FETCH_ASSOC);
			if($st->rowCount() != 0)
				return round($ligne["moyenne_uecap"], 2); //si c'est le cas, on renvoie la moyenne capitalisee
				
			//cette requete recupere la note de l'etudiant a l'examen specifie
			$sqlQuery = "select note from Note where id_examen=".$id_exam." AND id_etud=".$this->id.($prendreSimulees == true ? "" : " AND simulee=false").";";
			$st = $this->db->prepare($sqlQuery);
			$st->execute();
			$ligne = $st->fetch(PDO::FETCH_ASSOC);
			if($st->rowCount() != 0)
				return round($ligne["note"], 2);
			else
				return null;
		}
		
		public function getModuleMoy($id_module, $prendreSimulees) {
			
			//on regarde si ce module est dans une UE qui est actuellement capitalisee par l'etudiant
			$sqlQuery = "SELECT moyenne_uecap FROM ".UE_CAP_TABLE." WHERE id_ue IN(SELECT id_ue FROM ".MODULE_TABLE." WHERE id_module=".$id_module.") AND id_etud=".$this->id.";";
			$st = $this->db->prepare($sqlQuery);
			$st->execute();
			$ligne = $st->fetch(PDO::FETCH_ASSOC);
			if($st->rowCount() != 0)
				return round($ligne["moyenne_uecap"], 2); //si c'est le cas, on renvoie la moyenne capitalisee
			
			//cette requete recupere les notes de l'etudiant et leurs coefficients pour le module specifie
			$sqlQuery = "SELECT note, coefficient from ".NOTE_TABLE." left join ".EXAM_TABLE." ON ".NOTE_TABLE.".id_examen=".EXAM_TABLE.".id_examen left join ".MODULE_TABLE." ON ".EXAM_TABLE.".id_module=".MODULE_TABLE.".id_module WHERE ".NOTE_TABLE.".id_etud=".$this->id." AND ".MODULE_TABLE.".id_module=".$id_module.($prendreSimulees == true ? "" : " AND simulee=false").";";
			$st = $this->db->prepare($sqlQuery);
			$st->execute();
			return $this->calculer($st);
		}
		
		public function getUEMoy($id_ue, $prendreSimulees) {
			
			//on regarde si l'UE est capitalisee ou pas par l'etudiant
			$sh = new sqlhandler();
			$moy = $sh->getMoyUECap($this->id, $id_ue);
			if($moy != null)
				return round($moy, 2);
			
			//cette requete recupere les notes de l'etudiant et leurs coefficients pour tous les modules de l'UE specifiee
			$sqlQuery = "SELECT note, coefficient from ".NOTE_TABLE." left join ".EXAM_TABLE." ON ".NOTE_TABLE.".id_examen=".EXAM_TABLE.".id_examen WHERE id_etud=".$this->id." AND id_module IN (SELECT id_module FROM ".MODULE_TABLE." WHERE id_ue=".$id_ue.")".($prendreSimulees == true ? "" : " AND simulee=false").";";
			$st = $this->db->prepare($sqlQuery);
			$st->execute();
			return $this->calculer($st);
		}
		
		public function getParcoursMoy($id_parcours, $prendreSimulees) {
			
			//cette requete recupere les notes de l'etudiant et leurs coefficients pour tous les modules du parcours specifie
			$sqlQuery = "SELECT note, coefficient from ".NOTE_TABLE." left join ".EXAM_TABLE." ON ".NOTE_TABLE.".id_examen=".EXAM_TABLE.".id_examen WHERE id_etud=".$this->id." AND id_module IN (SELECT id_module FROM ".MODULE_TABLE." WHERE id_parcours=".$id_parcours.")".($prendreSimulees == true ? "" : " AND simulee=false").";";
			$st = $this->db->prepare($sqlQuery);
			$st->execute();
			return $this->calculer($st);
		}
		
		public function getEtuMoy($prendreSimulees) { //renvoie la moyenne generale de l'etudiant
			
			$sommeNotes = 0;
			$sommeCoefs = 0;
			//cette requete recupere les UE de l'etudiant
			$sqlQuery = "select id_ue from UE where id_sem IN (select Semestre.id_sem from Etudiant left join Groupe_TP on Etudiant.id_grptp=Groupe_TP.id_grptp LEFT JOIN Groupe_TD on Groupe_TP.id_grptd=Groupe_TD.id_grptd left join Semestre on Groupe_TD.id_sem=Semestre.id_sem where Etudiant.id_etud=".$this->id.");";
			$st = $this->db->prepare($sqlQuery);
			$st->execute();
			foreach($st->fetchAll(PDO::FETCH_ASSOC) as $ligne) {
				$id_ue = $ligne["id_ue"];
				$a = $this->estCapitalisee($id_ue, $this->id);
				if($a === false) { //si l'UE n'est pas capitalisee on calcule la moyenne des modules de cette UE
					$sqlQuery = "SELECT note, coefficient from ".NOTE_TABLE." left join ".EXAM_TABLE." ON ".NOTE_TABLE.".id_examen=".EXAM_TABLE.".id_examen WHERE id_etud=".$this->id." AND id_module IN (SELECT id_module FROM ".MODULE_TABLE." WHERE id_ue=".$id_ue.")".($prendreSimulees == true ? "" : " AND simulee=false").";";
					$st = $this->db->prepare($sqlQuery);
					$st->execute();
					while($ligne = $st->fetch(PDO::FETCH_ASSOC)) {
						$sommeCoefs += $ligne["coefficient"];
						$sommeNotes += $ligne["note"] * $ligne["coefficient"];
					}
				}
				else { //si l'UE est capitalisee, on recupere la somme des coefficients des modules de cette UE * la moyenne capitalisee
					$sommeNotes += $a["moyCap"] * $a["sommeCoefs"];
					$sommeCoefs += $a["sommeCoefs"];
				}
			}
			
			//on regarde ensuite si l'etudiant est inscrit a un parcours
			$sqlQuery = "select id_parcours from Etudiant where id_etud=".$this->id.";";
			$st = $this->db->prepare($sqlQuery);
			$st->execute();
			$ligne = $st->fetch(PDO::FETCH_ASSOC);
			$id_parcours = $ligne["id_parcours"];
			if($id_parcours != null) {
				$sqlQuery = "SELECT note, coefficient from ".NOTE_TABLE." left join ".EXAM_TABLE." ON ".NOTE_TABLE.".id_examen=".EXAM_TABLE.".id_examen WHERE id_etud=".$this->id." AND id_module IN (SELECT id_module FROM ".MODULE_TABLE." WHERE id_parcours=".$id_parcours.")".($prendreSimulees == true ? "" : " AND simulee=false").";";
				$st = $this->db->prepare($sqlQuery);
				$st->execute();
				while($ligne = $st->fetch(PDO::FETCH_ASSOC)) {
					$sommeCoefs += $ligne["coefficient"];
					$sommeNotes += $ligne["note"] * $ligne["coefficient"];
				}
			}
			
			if($sommeCoefs != 0)
				return round($sommeNotes / $sommeCoefs, 2);
			else
				return null;
		}
		
		private function estCapitalisee($id_ue, $id_etud) { //renvoie false si l'UE n'est pas capitalisee ou un array contenant la moyenne capitalisee et la somme des coefficients des modules de cette UE sinon
			$sqlQuery = "SELECT moyenne_uecap FROM ".UE_CAP_TABLE." WHERE id_ue=".$id_ue." AND id_etud=".$id_etud.";";
			$st = $this->db->prepare($sqlQuery);
			$st->execute();
			$ligne = $st->fetch(PDO::FETCH_ASSOC);
			if($st->rowCount() != 0) {
				$sommeCoefs = 0;
				$moyCap = $ligne["moyenne_uecap"];
				$sqlQuery = "select coefficient from Examen left join Module on Examen.id_module=Module.id_module where id_ue=".$id_ue.";";
				$st = $this->db->prepare($sqlQuery);
				$st->execute();
				while($ligne = $st->fetch(PDO::FETCH_ASSOC))
					$sommeCoefs += $ligne["coefficient"];
				return array("moyCap" => $moyCap, "sommeCoefs" => $sommeCoefs);
			}
			else
				return false;
		}
		
		private function getLine($item1, $item2) {
			return "<tr class=\"ddeRow\"><td class=\"ddeCell expand\">".$item1."</td><td class=\"ddeCell shrink\">".$item2."</td></tr>";
		}
		
		public function getTopLines() {
			return "<tr><td class=\"ddeCell expand columnLabel bold\">Libell&eacute;</td><td class=\"ddeCell shrink columnLabel bold\">Moyenne</td></tr>";
		}
		
		public function getBottomLines($item1, $item2, $item3, $item4) {
			$code = "<table class=\"ddeTable\"><tr class=\"ddeRow\"><td class=\"ddeCell expand bold\">".$item1."</td><td class=\"ddeCell shrink\">".$item2."</td></tr>";
			$code .= "<tr class=\"ddeRow\"><td class=\"ddeCell expand bold\">".$item3."</td><td class=\"ddeCell shrink\">".$item4."</td></tr></table>";
			return $code;
		}
		
		public function getEtuSummary() {
			
			//cette requete recupere les UE de l'etudiant
			$sqlQuery = "select id_ue, nom_ue from UE where id_sem IN (select Semestre.id_sem from Etudiant left join Groupe_TP on Etudiant.id_grptp=Groupe_TP.id_grptp LEFT JOIN Groupe_TD on Groupe_TP.id_grptd=Groupe_TD.id_grptd left join Semestre on Groupe_TD.id_sem=Semestre.id_sem where Etudiant.id_etud=".$this->id.");";
			$st = $this->db->prepare($sqlQuery);
			$st->execute();
			$code = "";
			while($ligne = $st->fetch(PDO::FETCH_ASSOC)) {
				$code .= $this->getLine($ligne["nom_ue"], $this->colorer($this->getUEMoy($ligne["id_ue"], true)));
				$code .= $this->getUESummary($ligne["id_ue"]);
			}
			
			//cette requete recupere le parcours de semestre de l'etudiant (s'il en a un)
			$sqlQuery = "select Parcours.id_parcours, nom_parcours from Etudiant left join Parcours on Etudiant.id_parcours=Parcours.id_parcours where Etudiant.id_etud=".$this->id.";";
			$st = $this->db->prepare($sqlQuery);
			$st->execute();
			$ligne = $st->fetch(PDO::FETCH_ASSOC);
			if(isset($ligne["id_parcours"]) && $ligne["id_parcours"] != null) {
				$code .= $this->getLine($ligne["nom_parcours"], $this->colorer($this->getParcoursMoy($ligne["id_parcours"], true)));
				$code .= $this->getParcoursSummary($ligne["id_parcours"]);
			}
			return $code;
		}
		
		public function getUESummary($id_ue) {
			$sqlQuery = "SELECT id_module, nom_module FROM ".MODULE_TABLE." WHERE id_ue=".$id_ue.";";
			$st = $this->db->prepare($sqlQuery);
			$st->execute();
			$code = "";
			while($ligne = $st->fetch(PDO::FETCH_ASSOC)) {
				$code .= $this->getLine("&nbsp;&nbsp;".$ligne["nom_module"], $this->colorer($this->getModuleMoy($ligne["id_module"], true)));
				$code .= $this->getModuleNoteList($ligne["id_module"]);
			}
			return $code;
		}
		
		public function getParcoursSummary($id_parcours) {
			$sqlQuery = "SELECT id_module, nom_module FROM ".MODULE_TABLE." WHERE id_parcours=".$id_parcours.";";
			$st = $this->db->prepare($sqlQuery);
			$st->execute();
			$code = "";
			while($ligne = $st->fetch(PDO::FETCH_ASSOC)) {
				$code .= $this->getLine("&nbsp;&nbsp;".$ligne["nom_module"], $this->colorer($this->getModuleMoy($ligne["id_module"], true)));
				$code .= $this->getModuleNoteList($ligne["id_module"]);
			}
			return $code;
		}
		
		public function getModuleNoteList($id_module) {
			$sqlQuery = "SELECT nom_examen, note, simulee from ".NOTE_TABLE." left join ".EXAM_TABLE." ON ".NOTE_TABLE.".id_examen=".EXAM_TABLE.".id_examen WHERE id_etud=".$this->id." AND id_module=".$id_module.";";
			$st = $this->db->prepare($sqlQuery);
			$st->execute();
			$code = "";
			while($ligne = $st->fetch(PDO::FETCH_ASSOC))
				$code .= $this->getLine("<span class=\"italic\">&nbsp;&nbsp;&nbsp;&nbsp;".$ligne["nom_examen"]."</span>", $this->colorer($ligne["note"]).($ligne["simulee"] == true ? " (simul&eacute;e)" : ""));
			return $code;
		}
		
		private function calculer($st) {
			$sommeCoefs = 0;
			$sommeNotes = 0;
			while($ligne = $st->fetch(PDO::FETCH_ASSOC)) {
				$sommeCoefs += $ligne["coefficient"];
				$sommeNotes += $ligne["note"] * $ligne["coefficient"];
			}
			if($sommeCoefs != 0)
				return round($sommeNotes / $sommeCoefs, 2);
			else
				return null;
		}
		
		public function colorer($note) {
			if($note >= 10)
				return "<span class=\"green\">".$note."</span>";
			else if($note >= 8)
				return "<span class=\"orange\">".$note."</span>";
			else
				return "<span class=\"red\">".$note."</span>";
		}
	}
	
?>
